//package com.cy.embeddingdemo.store;
//
//import dev.langchain4j.data.document.Document;
//import dev.langchain4j.data.document.Metadata;
//import dev.langchain4j.data.document.loader.ClassPathDocumentLoader;
//import dev.langchain4j.data.document.parser.TextDocumentParser;
//import dev.langchain4j.data.document.splitter.DocumentByCharacterSplitter;
//import dev.langchain4j.data.embedding.Embedding;
//import dev.langchain4j.data.segment.TextSegment;
//import dev.langchain4j.model.embedding.EmbeddingModel;
//import dev.langchain4j.model.ollama.OllamaEmbeddingModel;
//import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
//import dev.langchain4j.model.output.Response;
//import dev.langchain4j.store.embedding.EmbeddingMatch;
//import dev.langchain4j.store.embedding.EmbeddingSearchRequest;
//import dev.langchain4j.store.embedding.EmbeddingSearchResult;
//import dev.langchain4j.store.embedding.filter.comparison.IsEqualTo;
//import dev.langchain4j.store.embedding.filter.comparison.IsIn;
//import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
//import dev.langchain4j.store.embedding.milvus.MilvusEmbeddingStore;
//import jakarta.annotation.Resource;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.util.List;
//import java.util.stream.Collectors;
//
//@Slf4j
//@Component
//public class VectorStoreService {
//
//    @Resource
//    private OpenAiEmbeddingModel embeddingModel;
//    @Resource
//    private MilvusEmbeddingStore milvusEmbeddingStore;
//
//    /**
//     * 仅存储了向量，没有原文本和元数据信息
//     *
//     * @param text 要嵌入的文本
//     * @return 生成ID
//     */
//    public String embedding(String text) {
//        Response<Embedding> embed = embeddingModel.embed(text);
//        return milvusEmbeddingStore.add(embed.content());
//    }
//
//    /**
//     * 带有元数据的方式
//     *
//     * @param text 要嵌入的文本
//     * @return 生成ID
//     */
//    public String embeddingWithMeta(String text) {
//        TextSegment textSegment = TextSegment.from(text, Metadata.from("userId", "1"));
//        Response<Embedding> embed = embeddingModel.embed(textSegment);
//        return milvusEmbeddingStore.add(embed.content(), textSegment);
//    }
//
//    public List<String> search(String query) {
//        Embedding queryEmbedding = embeddingModel.embed(query).content();
//
//        new IsIn("userId", List.of("1", "2","3"));
////        Filter filter = MetadataFilterBuilder.metadataKey("userId").isEqualTo("1");
//        EmbeddingSearchRequest request = EmbeddingSearchRequest.builder()
//                .queryEmbedding(queryEmbedding) // 相似性搜索文本
//                .filter(new IsEqualTo("userId", "1"))
//                .minScore(0.6)
//                .build();
//        EmbeddingSearchResult<TextSegment> result = milvusEmbeddingStore.search(request);
//        return result.matches().stream().map(r-> r.embedded().text()).collect(Collectors.toList());
//    }
//
//
//    /**
//     * 解析整个小说，分词之后进行 embedding
//     * @param
//     * @return
//     */
//    public String embeddingBook() {
//        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("rag/all.txt");
//        if (inputStream == null) {
//            log.error("Resource file rag/all.txt not found");
//            return "error: file not found";
//        }
//
//        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
//            StringBuilder block = new StringBuilder();
//            String line;
//            int blockCount = 0;
//
//
//            //- 当前代码按行读取并累积字符，达到 10000 字符后直接分块。这可能导致句子、段落或章节被截断，破坏语义完整性。
//
//            while ((line = reader.readLine()) != null) {
//                if (block.length() + line.length() > 10000) {
//                    processBlock(block);  //分块处理，不断读取文件，直到达到10000个字符， 就开始处理
//                    blockCount++;          // 统计分块数量
//                    block.setLength(0);
//                }
//                block.append(line).append("\n");   //累计字符，直到达到10000个字符， 就开始处理
//            }
//
//            // 处理最后一个块，如果这个块内容小于10000个字符，也需要处理
//            if (block.length() > 0) {
//                processBlock(block);
//                blockCount++;
//            }
//
//            log.info("分块数量:", blockCount);
//            return "ok";
//        } catch (IOException e) {
//            log.error("Error processing file", e);
//            return "error: " + e.getMessage();
//        }
//    }
//
//    private void processBlock(StringBuilder block) {
//        long startTime = System.currentTimeMillis(); // 记录开始时间
//        Document blockDocument = Document.from(block.toString());
//        insertToMilvus(blockDocument);
//        long endTime = System.currentTimeMillis(); // 记录结束时间
//        double elapsedTime = (endTime - startTime) / 1000.0; // 计算耗时（秒）
//        log.info("分块处理完成，耗时: {} 秒", elapsedTime);
//    }
//
//    public void insertToMilvus(Document blockDocument){
//
//        DocumentByCharacterSplitter documentByCharacterSplitter = new DocumentByCharacterSplitter(
//                200,  // 每段最大字数设置为200
//                20    // 自然语言重叠最大字数设置为20
//        );
//
//        List<TextSegment> segments = documentByCharacterSplitter.split(blockDocument);
//
//        List<Embedding> embeddings = embeddingModel.embedAll(segments).content();
//
//        // 存入
//        // InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
//        milvusEmbeddingStore.addAll(embeddings,segments);
//        log.info("embeddings size:{}", embeddings.size());
//    }
//}
//
